package com.thirtydays.frame.util

import android.app.Activity
import android.content.Context
import android.graphics.Bitmap
import androidx.activity.result.ActivityResultLauncher
import com.luck.picture.lib.animators.AnimationType
import com.luck.picture.lib.basic.PictureSelector
import com.luck.picture.lib.config.SelectMimeType
import com.luck.picture.lib.config.SelectModeConfig
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.interfaces.OnResultCallbackListener
import com.luck.picture.lib.language.LanguageConfig
import com.thirtydays.frame.base.bean.UpdataFile
import com.thirtydays.frame.util.ext.saveBitMap

/**
 * @author 小垚
 * @创建时间： 2020/12/16
 * @描述：图片选取工具类
 **/
object PictureSelectorUtils {
    /**
     * 打开相册
     * @type SelectMimeType ofAll()、ofImage、ofVideo、ofAudio
     */
    fun openPhotoAlbum(
        context: Context,
        type: Int = SelectMimeType.ofImage(),
        selList: MutableList<LocalMedia> = mutableListOf(), //相册已选数据
        imageMax: Int = 9,    //图片最大选择数量
        videoMax: Int = 9,    //视频最大选择数量
        filterMaxVideo: Int = 5 * 60,  //最大时长视频或音频秒
        filterMinVideo: Int = 1 * 60,  //最小时长视频或音频秒
        listener: (files: MutableList<UpdataFile>, media: List<LocalMedia>) -> Unit
    ) {
        PictureSelector.create(context)
            .openGallery(type)  //选取打开类型
            .setImageEngine(CoilEngine.INSTANCE) //设置图片加载框架
            .setLanguage(LanguageConfig.CHINESE)  //设置语言
            .setSelectedData(selList)  //相册已选数据
            .setRecyclerAnimationMode(AnimationType.SLIDE_IN_BOTTOM_ANIMATION) //相册列表动画效果
            .setImageSpanCount(3) //相册列表每行显示个数
            .isDisplayCamera(false) //是否显示相机入口
            .isPageStrategy(true) //是否开启分页模式
            .setSelectionMode(SelectModeConfig.MULTIPLE) //单选或是多选
            .setMaxSelectNum(imageMax)   //图片最大选择数量
            .setMinSelectNum(0)  //图片最小选择数量
            .setMaxVideoSelectNum(videoMax) //视频最大选择数量
            .setMinVideoSelectNum(0) //视频最小选择数量
            .setSelectMaxDurationSecond(filterMaxVideo)//最大时长视频或音频秒
            .setSelectMinDurationSecond(filterMinVideo)//最小时长视频或音频秒
            .isPreviewAudio(false) //是否支持音频预览
            .isPreviewImage(false) //是否支持预览图片
            .isPreviewVideo(false) //是否支持预览视频
            .isPreviewFullScreenMode(true) //预览点击全屏效果
            .isEmptyResultReturn(true) //支持未选择返回
            .isOpenClickSound(false) //是否开启点击音效
            .isGif(true) //是否显示gif文件
            .isWebp(true) //是否显示webp文件
            .isBmp(true)  //是否显示bmp文件
            .isMaxSelectEnabledMask(true) //达到最大选择数是否开启禁选蒙层
            .isAutomaticTitleRecyclerTop(true) //点击相册标题是否快速回到第一项
            .isFastSlidingSelect(true) //快速滑动选择
            .setCompressEngine(ImageCompressEngine())  //压缩
            .setCropEngine(ImageCropEngine())  //裁剪
            .forResult(object : OnResultCallbackListener<LocalMedia> {
                override fun onResult(result: ArrayList<LocalMedia>) {
                    listener(setList(result), result)
                }

                override fun onCancel() {

                }
            })
    }

    /**
     * 单独拍照
     */
    fun createPhoto(
        acivity: Activity,
        pat: ActivityResultLauncher<Void?>
    ) {
        pat?.launch(null)
    }


    /**
     * 拍照回调
     */
    fun addBitmap(bitmap: Bitmap, listener: (files: MutableList<UpdataFile>, media: List<LocalMedia>) -> Unit) {
        var absolutePath = bitmap.saveBitMap()
        var medias = mutableListOf(LocalMedia().apply {
            path = absolutePath
        })
        listener(setList(medias), medias)
    }


    fun setList(result: List<LocalMedia>): MutableList<UpdataFile> {
        val fileList: MutableList<UpdataFile> = mutableListOf()
        result.forEachIndexed { _, media ->
            var file: UpdataFile? = null
            var path = ""
            path = if (media.isCut) {
                media.cutPath
            } else if (media.isCompressed) {
                media.compressPath
            } else {
                if (media.realPath == null) {
                    media.path
                } else {
                    media.realPath
                }
            }

            val fileName = path.substring(path.lastIndexOf("/") + 1, path.length)
            file = UpdataFile(fileName, path)
            fileList.add(file)
        }
        return fileList
    }
}